其他
版本发布过程中的屏蔽/恢复告警
监控是运维进行业务上线后的最后一个环节,我们需要通过监控了解业务的运行状态,对告警及时干预,保证业务的稳定。
版本发布
在系统版本发布过程中,需要对应用服务进行重启,此时在监控的检测周期内会触发应用告警,而这个告警属于正常的例行维护,应该将此告警屏蔽,待发版完成并测试正常后再恢复告警,保证监控有条不紊的运行。
上述版本发布流程如下:
版本发布过程中可能会涉及多个开源产品,如jenkins、git、cmdb、应用容器、zabbix等,而大多公司内部没有一条ESB总线将各个平台或系统串联,因此需要通过各独立的接口供运维直接访问调用。
在此我们主要介绍下版本发布过程中,通过调用zabbix API实现zabbix屏蔽告警/恢复告警。
屏蔽/恢复告警
1.流程
以上流程是版本发布流水线触发调用zabbix api实现屏蔽/恢复告警功能,注意这个过程不做版本测试是否成功(在上游流水线中自行判断),只是用来禁用/启用监控项。
2.环境说明
此套流程用于已经确定好ip的情况下,匹配的是此ip下的监控项,因此:
请修改:
ZBX #zabbix api 地址
hostip #主机ip
3.代码实现
#!/bin/bash
#comment: 此脚本用于发版过程中屏蔽zabbix监控项,发版正常后恢复zabbix监控项
#grep -Po 使用perl正则 \K 左边的所有东西被"退回"且不作为该正则表达式的匹配部分
#获取主机hostid
function get_hostid(){
#获取hostid
hostid=`curl -s --connect-timeout 10 -m 20 -X POST -H 'Content-Type:application/json' -d'
{
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"filter": {
"host": [
"'"${hostip}"'"
]
}
},
"auth": "'"${zabbix_token}"'",
"id": 1
}' $ZBX|grep -Po '"hostid[":]+\K[^"]+'`
echo $hostid
}
#获取监控项itemid
function get_itemid(){
#获取itemid
itemid=`curl -s --connect-timeout 10 -m 20 -X POST -H 'Content-Type:application/json' -d'
{
"jsonrpc": "2.0",
"method": "item.get",
"params": {
"output": "extend",
"hostids": "'"${hostid}"'",
"search": {
"key_": "'"$1"'"
},
"sortfield": "name"
},
"auth": "'"${zabbix_token}"'",
"id": 1
}' $ZBX|grep -Po '"itemid[":]+\K[^"]+'`
echo $itemid
}
#屏蔽/恢复监控项,status:1禁用;status:0启用
function update_itemid(){
update_itemid=`curl -w %{http_code} -s -X POST -H 'Content-Type:application/json' -d'
{
"jsonrpc": "2.0",
"method": "item.update",
"params": {
"itemid": "'"$1"'",
"status": '$2'
},
"auth": "'"${zabbix_token}"'",
"id": 1
}' $ZBX`
echo $update_itemid
}
#主程序
#zabbix-server的地址,请自行修改
ZBX="http://zabbix.server.api/api_jsonrpc.php"
##zabbix api token,请自行修改
zabbix_token=xxxxxxxxxxxxxxxxxxxxxxx
#主机ip,请自行修改
hostip=xxxxx
echo -e "\033[33m进入zabbix监控屏蔽及恢复过程中,是否失败不影响发版,请放心使用\033[0m"
KEY=$2
case $1 in
"masking_alarm")
echo -e "\033[32m开始屏蔽zabbix监控项\033[0m"
echo $KEY
#屏蔽监控项
#status:1 禁用
status=1
if [ -z "$KEY" ];then
echo -e "\033[31m 请输入监控项的健值\033[0m"
exit 1
else
hostid=$(get_hostid)
if [ ${#hostid} -eq 0 ];then
echo -e "\033[31mhostid为空,请检查api能否访问\033[0m"
exit 1
else
key_list=($KEY)
for key in ${key_list[@]}
do
itemid_list=$(get_itemid $key)
if [ "${#itemid_list}" -eq 9 ];then
echo -e "\033[31mitemid为空,请在zabbix上检查key是否存在\033[0m"
exit 1
else
for itemid in ${itemid_list}
do
update_itemid $itemid $status
done
fi
done
fi
fi
;;
#恢复监控项
"recovery_alarm")
echo -e "\033[32m开始恢复zabbix监控项\033[0m"
echo $KEY
#status:0 启用
status=0
if [ -z "$KEY" ];then
echo -e "\033[31m 请输入监控项的健值\033[0m"
exit 1
else
hostid=$(get_hostid)
if [ ${#hostid} -eq 0 ];then
echo -e "\033[31mhostid为空,请检查api能否访问\033[0m"
exit 1
else
key_list=($KEY)
for key in ${key_list[@]}
do
itemid_list=$(get_itemid $key)
if [ "${#itemid_list}" -eq 9 ];then
echo -e "\033[31mitemid为空,请在zabbix上检查key是否存在\033[0m"
exit 1
else
for itemid in ${itemid_list}
do
update_itemid $itemid $status
done
fi
done
fi
fi
;;
*)
echo "请选择masking_alarm或recovery_alarm"
exit 1
;;
esac
4.代码执行
#屏蔽告警
bash zabbix.sh masking_alarm website.code[http://xxxxxxx/1]
进入zabbix监控屏蔽及恢复过程中,是否失败不影响发版,请放心使用
开始屏蔽zabbix监控项
website.code[http://xxxxxxx]
{"jsonrpc":"2.0","result":{"itemids":["111502"]},"id":1}200
#恢复告警
bash zabbix.sh recovery_alarm website.code[http://xxxxxxx/1]
进入zabbix监控屏蔽及恢复过程中,是否失败不影响发版,请放心使用
开始恢复zabbix监控项
website.code[http://xxxxxxxx]
{"jsonrpc":"2.0","result":{"itemids":["111502"]},"id":1}200
屏蔽或恢复后,请至zabbix检查监控监控项状态是否一致。
注意:
此脚本也可进行监控项的模糊匹配
#匹配监控项key包含xxxxxxx
bash zabbix.sh recovery_alarm xxxxxxx
2. 此脚本可以进行多行匹配,须保证每个key值回车换行
总结
普通的监控项,基本可以通过以上脚本的模糊匹配解决;
对于同一个接口,可能会有url和port监控同时存在的情况,此时我们须在监控项key中做下关联,以便可以通过两个key中的同一字符模糊匹配同时操作这两个监控项,减少屏蔽恢复的时间,从而提高版本发布效率。
END